// 《围棋》作者版权所有。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package net

// parsePort将服务解析为十进制整数，并将
// 对应的值返回为port。调用方有责任在needsLookup为true时将服务解析为非十进制整数。
// 
// 当给定一个数字
// 超过65536时，一些系统解析程序将返回一个有效的端口号（请参阅https:
// 无法在数字>65536时提前退出。因此，合理的大/小
// 数字将被完整解析，如果无效，将被拒绝。
func parsePort(service string) (port int, needsLookup bool) {
	if service == "" {
		// 锁定空字符串
		// 表示端口0的旧行为。见戈朗。org/issue/13610。
		return 0, false
	}
	const (
		max    = uint32(1<<32 - 1)
		cutoff = uint32(1 << 30)
	)
	neg := false
	if service[0] == '+' {
		service = service[1:]
	} else if service[0] == '-' {
		neg = true
		service = service[1:]
	}
	var n uint32
	for _, d := range service {
		if '0' <= d && d <= '9' {
			d -= '0'
		} else {
			return 0, true
		}
		if n >= cutoff {
			n = max
			break
		}
		n *= 10
		nn := n + uint32(d)
		if nn < n || nn > max {
			n = max
			break
		}
		n = nn
	}
	if !neg && n >= cutoff {
		port = int(cutoff - 1)
	} else if neg && n > cutoff {
		port = int(cutoff)
	} else {
		port = int(n)
	}
	if neg {
		port = -port
	}
	return port, false
}
